package com.rainbow.common.core.toolkit;

import org.apache.commons.collections4.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;

import java.text.Collator;
import java.util.*;

/**
 * 打印异常具体堆栈
 * @author 傅为地
 */
public class ErrorPrintHandle {

    /**
     * 打印异常堆栈信息
     * @param e 异常数据
     * @return 异常堆栈
     */
    public static String getErrorStackDetail(Exception e){
        return getErrorInfo(e);
    }

    /**
     * 打印异常堆栈信息
     * @param e 异常数据
     * @return 异常堆栈
     */
    public static String getErrorStackDetail(Throwable e){
        return getErrorInfo(e);
    }

    /**
     * 打印异常堆栈信息
     * @param e 异常数据
     * @return 异常堆栈
     */
    private static String getErrorInfo(Throwable e) {
        StringBuffer errorStack=new StringBuffer(2048);
        errorStack.append(e.toString());
        StackTraceElement[] stackArr=e.getStackTrace();
        if(!org.springframework.util.ObjectUtils.isEmpty(stackArr)){
            for (StackTraceElement stack: stackArr) {
                errorStack.append("\n\tat " + stack);
            }
        }
        return errorStack.toString();
    }
    /**
     * 表单验证结果
     * @param userResult:表单验证参数
     * @return 表单验证结果
     */
    public static List<Map<String, String>> validErrorResult(BindingResult userResult) {
        List<Map<String, String>> errorList= new ArrayList<>();
        if (userResult.hasErrors()) {
            List<ObjectError> errors = userResult.getAllErrors();
            for (ObjectError error : errors) {
                Map<String, String> map  = new HashMap<>();
                if(error instanceof FieldError){
                    FieldError err= (FieldError) error;
                    map.put("field", err.getField());
                }else{
                    map.put("field", error.getObjectName());
                }
                map.put("error", MessageI18nUtil.getMessage(error.getDefaultMessage()));
                errorList.add(map);
            }
            //针对field字段不为空，才做排序，空值需要单独处理
            sortList(errorList);
        }
        return errorList;
    }

    /**
     * 排序处理
     * @param errorList 错误列表
     */
    public static void sortList(List<Map<String, String>> errorList){
        //针对field字段不为空，才做排序，空值需要单独处理
        if(CollectionUtils.isNotEmpty(errorList)){
            errorList.sort((Comparator<Map>) (o1, o2) -> {
                //获取英文环境
                Comparator<Object> com = Collator.getInstance(Locale.ENGLISH);
                return com.compare(o1.get("field"), o2.get("field"));
            });
        }
    }

}
